package com.boil.qz.safekavass.service;

import com.boil.pojo.ResultVo;
import com.boil.qz.safekavass.dao.MybatisDao;
import com.boil.qz.safekavass.model.WeixinSendredpack;
import com.boil.qz.safekavass.pojo.WeixinSendredpackVo;
import com.boil.qz.safekavass.weixin.util.WeixinUtils;
import com.boil.util.Constants;
import com.boil.util.DateUtils;
import com.boil.util.Utils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * Created by ChenYong on 2017-05-27.
 * <br>
 * 微信发普通红包 Service。
 */
@Service
public class WeixinSendredpackService {
    /**
     * 注入 Mybatis Dao
     */
    @Autowired
    private MybatisDao mybatisDao;

    /**
     * 保存微信发普通红包。
     *
     * @param weixinSendredpack 微信发普通红包实例
     * @return 微信发普通红包的个数
     */
    public int save(WeixinSendredpack weixinSendredpack) {
        if (weixinSendredpack == null) {
            return Constants.VALUE_0;
        }

        // 当前日期字符串
        String currDateStr = DateUtils.format(DateUtils.getCurrDate(), Constants.DATE_FORMAT_7);
        // 查询条件
        Map<String, Object> map = new HashMap<String, Object>();
        // 商户订单号
        String mch_billno = "";

        map.put("mch_billno", String.format("%s%s", WeixinUtils.MCH_ID, currDateStr));

        // 查询最大商户订单号
        String maxMch_billno = mybatisDao.selectOne("weixinSendredpackNs.findMax_mch_billno", map);

        // 空，表示今天未发红包，商户订单号从 1 开始
        if (StringUtils.isBlank(maxMch_billno)) {
            mch_billno = String.format("%s%s%s", //
                    WeixinUtils.MCH_ID, //
                    currDateStr, //
                    Utils.getZerofillStr(Constants.VALUE_1, Constants.VALUE_10));

            // 非空，表示今天已发红包，商户订单号为今天的最大商户订单号 + 1
        } else {
            mch_billno = String.format("%s%s%s", //
                    WeixinUtils.MCH_ID, //
                    currDateStr, //
                    Utils.getZerofillStr((Integer.valueOf(maxMch_billno.substring(Constants.VALUE_18)) + Constants.VALUE_1), Constants.VALUE_10));
        }

        weixinSendredpack.setMch_billno(mch_billno);
        weixinSendredpack.setMch_id(WeixinUtils.MCH_ID);
        weixinSendredpack.setNonce_str(Utils.getUuid().toUpperCase(Locale.getDefault()));
        weixinSendredpack.setWxappid(WeixinUtils.APP_ID);
        weixinSendredpack.setSend_name(WeixinUtils.SEND_NAME);
        weixinSendredpack.setWishing(WeixinUtils.WISHING);
        weixinSendredpack.setClient_ip(WeixinUtils.CLIENT_IP);
        weixinSendredpack.setAct_name(WeixinUtils.ACT_NAME);
        weixinSendredpack.setScene_id(WeixinUtils.SCENE_ID_PRODUCT_4);
        weixinSendredpack.setRisk_info(Constants.EMPTY_STR);
        weixinSendredpack.setConsume_mch_id(Constants.EMPTY_STR);
        weixinSendredpack.setSign(WeixinUtils.getWeixinSendredpackSign(weixinSendredpack));
        weixinSendredpack.setSendredpack_time(new Date());

        return mybatisDao.insert("weixinSendredpackNs.save", weixinSendredpack);
    }

    /**
     * 处理微信发普通红包。
     *
     * @param resultVo          结果 Vo 实例
     * @param weixinSendredpack 微信发普通红包实例
     */
    public void doSendredpack(ResultVo resultVo, WeixinSendredpack weixinSendredpack) {
        if ((resultVo != null) && (weixinSendredpack != null)) {
            // 保存红包
            int saveFlag = save(weixinSendredpack);

            // 处理发红包
            if (saveFlag > Constants.VALUE_0) {
                // 指定发红包的请求参数
                WeixinSendredpackVo sendredpackParam = new WeixinSendredpackVo();
                sendredpackParam.setMch_billno(weixinSendredpack.getMch_billno());
                sendredpackParam.setSign(weixinSendredpack.getSign());
                sendredpackParam.setMch_id(weixinSendredpack.getMch_id());
                sendredpackParam.setWxappid(weixinSendredpack.getWxappid());
                sendredpackParam.setSend_name(weixinSendredpack.getSend_name());
                sendredpackParam.setRe_openid(weixinSendredpack.getRe_openid());
                sendredpackParam.setTotal_amount(weixinSendredpack.getTotal_amount());
                sendredpackParam.setTotal_num(weixinSendredpack.getTotal_num());
                sendredpackParam.setWishing(weixinSendredpack.getWishing());
                sendredpackParam.setClient_ip(weixinSendredpack.getClient_ip());
                sendredpackParam.setAct_name(weixinSendredpack.getAct_name());
                sendredpackParam.setRemark(weixinSendredpack.getRemark());
                sendredpackParam.setScene_id(weixinSendredpack.getScene_id());
                sendredpackParam.setConsume_mch_id(weixinSendredpack.getConsume_mch_id());
                sendredpackParam.setNonce_str(weixinSendredpack.getNonce_str());
                sendredpackParam.setRisk_info(weixinSendredpack.getRisk_info());

                // 调用接口发普通红包
                String sendredpackResultXml = WeixinUtils.sendCertHttpsPost(WeixinUtils.URL_POST_SENDREDPACK, Utils.bean2Xml(sendredpackParam));
                // 发普通红包结果
                Map<String, String> sendredpackResultMap = Utils.xml2Map(sendredpackResultXml);
                // 返回状态码
                String return_code = sendredpackResultMap.get(WeixinUtils.RETURN_CODE_STR);
                // 返回信息
                String return_msg = sendredpackResultMap.get(WeixinUtils.RETURN_MSG_STR);
                // 业务结果
                String result_code = sendredpackResultMap.get(WeixinUtils.RESULT_CODE_STR);
                // 错误代码
                String err_code = sendredpackResultMap.get(WeixinUtils.ERR_CODE_STR);
                // 错误代码描述
                String err_code_des = sendredpackResultMap.get(WeixinUtils.ERR_CODE_DES_STR);
                // 微信单号
                String send_listid = sendredpackResultMap.get(WeixinUtils.SEND_LISTID_STR);

                // 发红包成功
                if (WeixinUtils.SUCCESS_STR.equals(return_code) && WeixinUtils.SUCCESS_STR.equals(result_code)) {
                    resultVo.setResultCode(Constants.SUCCESS);
                    resultVo.setResultMsg(WeixinUtils.SUCCESS_SENDREDPACK_MSG);

                    // 发红包失败
                } else {
                    StringBuffer errorMsgSb = new StringBuffer();
                    errorMsgSb.append(Constants.SENDREDPACK_ERROR_MSG);
                    errorMsgSb.append(Constants.NEWLINE_BR);

                    if (WeixinUtils.SUCCESS_STR.equals(return_code)) {
                        errorMsgSb.append(return_msg);
                        errorMsgSb.append(Constants.NEWLINE_BR);
                        errorMsgSb.append(err_code);
                        errorMsgSb.append(Constants.MINUS_CHAR);
                        errorMsgSb.append(err_code_des);
                    }

                    resultVo.setResultCode(Constants.SENDREDPACK_ERROR);
                    resultVo.setResultMsg(errorMsgSb.toString());
                }

                // 更新发普通红包结果
                Map<String, Object> map = new HashMap<String, Object>();
                map.put(WeixinUtils.MCH_BILLNO_STR, weixinSendredpack.getMch_billno());
                map.put(WeixinUtils.RETURN_CODE_STR, return_code);
                map.put(WeixinUtils.RETURN_MSG_STR, return_msg);
                map.put(WeixinUtils.RESULT_CODE_STR, result_code);
                map.put(WeixinUtils.ERR_CODE_STR, err_code);
                map.put(WeixinUtils.ERR_CODE_DES_STR, err_code_des);
                map.put(WeixinUtils.SEND_LISTID_STR, send_listid);

                mybatisDao.update("weixinSendredpackNs.updateResult", map);
            }
        }
    }
}